package utils; 
 
import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.*; 
 
/** 
 * 读取配置文件
 */ 
public class PropertiesUtil extends Properties { 
 
  /** 
   * 因为LinkedHashSet有序，所以，key在调用put()的时候，存放到这里也就有序。 
   */ 
  private final LinkedHashSet<Object> keys = new LinkedHashSet<>(); 
 
  @Override 
  public Enumeration<Object> keys() { 
    return Collections.enumeration(keys); 
  } 
 
  /** 
   * 在put的时候，只是把key有序的存到{@link PropertiesUtil#keys} 
   * 取值的时候，根据有序的keys，可以有序的取出所有value 
   * 依然调用父类的put方法,也就是key value 键值对还是存在hashTable里. 
   * 只是现在多了个存key的属性{@link PropertiesUtil#keys} 
   */ 
  @Override 
  public Object put(Object key, Object value) { 
    keys.add(key); 
    return super.put(key, value); 
  } 
 
  /** 
   * 因为复写了这个方法，在（方式一）的时候,才输出有序。 
   * {@link MainOrder#printProp} 
   */ 
  @Override 
  public Set<String> stringPropertyNames() { 
    Set<String> set = new LinkedHashSet<>(); 
    for (Object key : this.keys) { 
      set.add((String) key); 
    } 
    return set; 
  } 
 
  /** 
   * 因为复写了这个方法，在（方式二）的时候,才输出有序。 
   * {@link MainOrder#printProp} 
   */ 
  @Override 
  public Set<Object> keySet() { 
    return keys; 
  } 
 
  /** 
   * 因为复写了这个方法，在（方式四）的时候,才输出有序。 
   * {@link MainOrder#printProp} 
   */ 
  @Override 
  public Enumeration<?> propertyNames() { 
    return Collections.enumeration(keys); 
  }
  
  public static List<String> getPropKey(String key) { 
	Properties properties = readOrderedPropertiesFile(); 
	List<String> list = new ArrayList<String>();
	String valueString = properties.getProperty(key);
	for(String value : valueString.split(",")){
		list.add(value);
	}
    return list;
  }
  
  /** 
   * 读Properties文件（有序） 
   */ 
  private static Properties readOrderedPropertiesFile() { 
    Properties properties = new PropertiesUtil(); 
    InputStreamReader inputStreamReader = null; 
    try { 
      InputStream inputStream = new BufferedInputStream(new FileInputStream("F:\\eclipse workspace\\trade-quotation\\bin\\stkInfo.properties")); 
      //prop.load(in);//直接这么写，如果properties文件中有汉子，则汉字会乱码。因为未设置编码格式。 
      inputStreamReader = new InputStreamReader(inputStream, "utf-8"); 
      properties.load(inputStreamReader); 
    } catch (Exception e) { 
      System.out.println(e.getMessage()); 
    } finally { 
      if (inputStreamReader != null) { 
        try { 
          inputStreamReader.close(); 
        } catch (IOException e) { 
          System.out.println(e.getMessage()); 
        } 
      } 
    } 
    return properties; 
  } 
 
  /** 
   * 写Properties文件（有序） 
   */ 
  private static void writeOrderedPropertiesFile(Properties properties) { 
    properties.setProperty("phone", "10086"); 
    OutputStreamWriter outputStreamWriter = null; 
    try { 
      //保存属性到b.properties文件 
      FileOutputStream fileOutputStream = new FileOutputStream("stkInfo.properties", false);//true表示追加打开,false每次都是清空再重写 
      //prop.store(oFile, "此参数是保存生成properties文件中第一行的注释说明文字");//这个会两个地方乱码 
      //prop.store(new OutputStreamWriter(oFile, "utf-8"), "汉字乱码");//这个就是生成的properties文件中第一行的注释文字乱码 
      outputStreamWriter = new OutputStreamWriter(fileOutputStream, "utf-8"); 
      properties.store(outputStreamWriter, "lll"); 
    } catch (Exception e) { 
      System.out.println(e.getMessage()); 
    } finally { 
      if (outputStreamWriter != null) { 
        try { 
          outputStreamWriter.close(); 
        } catch (IOException e) { 
          System.out.println(e.getMessage()); 
        } 
      } 
    } 
 
  }   
  
} 
